(PYTHON) Day - 10 Sets(2)

Reference

  • 문제 출처 - HackerRank
  • 파이썬 연습 - Practice - Python

개인적인 생각과 상상으로 작성한 내용들이 포함되어 있습니다
문제를 풀고 Discussion Tab을 참고하며 코드 스타일을 개선하려고 노력하고자 합니다


HackerRank


Sets


No Idea!


문제 : 비교를 위한 배열(N) 하나와 서로소 집합 A, B가 있을 때, N의 원소가 A에 있으면 happiness +1, B에 있으면 happiness -1
입력 : 원소 수 n, m을 입력; 차례로 N 배열의 n개 원소와 집합 A, B의 m개 원소를 입력
출력 : happiness의 값
예제 : N 배열 - (1, 5, 3) A 집합 - (3, 1) B 집합 - (5, 7)
A 집합으로 인해 happiness +2, B 집합으로 인해 happiness -1, 최종 happiness = 1

3 2
1 5 3
3 1
5 7

1

element in set_a 표현으로 집합안에 원소가 존재하는지 확인할 수 있음

if **name** == '**main**':
n, m = map(int, input().split())
array_n = input().split()
set_a = {e for e in input().split()}
set_b = {e for e in input().split()}

happiness = 0
for element in array_n:
if element in set_a:
happiness += 1
if element in set_b:
happiness -= 1

print(happiness)

굳이 int 형으로 변환하지 않아도 됨

n, m = input().split()

array_n = input().split()
A = set(input().split())
B = set(input().split())

print(sum([(i in A) - (i in B) for i in array_n]))

Set .add()


문제 : Rupal이 방문한 나라의 이름을 출력(중복 삭제)
입력 : 반복할 횟수 n을 입력; 나라 이름을 횟수만큼 반복해서 입력
출력 : 총 나라의 개수
예제 : 7번 다른 나라를 방문했는데 UK와 France는 중복됨; 즉 distinct country는 5가 됨

7
UK
China
USA
France
New Zealand
UK
France

5

element in set_a 표현으로 집합안에 원소가 존재하는지 확인할 수 있음

if **name** == '**main**':
n = int(input())
stamps = set([input() for _ in range(n)])

print(len(stamps))

Set .discard(), .remove() & .pop()


문제 : 비교를 위한 배열(N) 하나와 서로소 집합 A, B가 있을 때, N의 원소가 A에 있으면 happiness +1, B에 있으면 happiness -1
입력 : 원소 수 n을 입력; 집합 s의 원소들 입력(모두 양의 정수, 9보다 작거나 같음); 명령어 수 N을 입력; 명령어 입력;
출력 : 최종 집합 s의 원소들 합
예제 : N 배열 - (1, 5, 3) A 집합 - (3, 1) B 집합 - (5, 7)
A 집합으로 인해 happiness +2, B 집합으로 인해 happiness -1, 최종 happiness = 1

9
1 2 3 4 5 6 7 8 9
10
pop
remove 9
discard 9
discard 8
remove 7
pop
discard 6
remove 5
pop
discard 5

4

eval() 함수를 사용하면 쉽게 해결 가능

if **name** == '**main**':
n = int(input())
s = set(map(int, input().split()))

for i in range(int(input())):
eval('s.{0}({1})'.format(*input().split()+['']))

print(sum(s))

Set .union() Operation


입력 : 학생 수 n 입력; 영어 신문을 구독하는 학생 번호 입력; 학생 수 b 입력; 프랑스 신문을 구독하는 학생 번호 입력
출력 : 영어 신문, 프랑스 신문 둘 중 하나라도 구독하는 학생 수
예제 : 영어 신문 구독하는 학생 번호 - (1 2 3 4 5 6 7 8 9) 프랑스 신문 - (10 1 2 3 11 21 55 6 8)
하나라도 구독하는 학생 번호 - (1 2 3 4 5 6 7 8 9 10 11 21 55)

9
1 2 3 4 5 6 7 8 9
9
10 1 2 3 11 21 55 6 8

13

union() 함수를 사용해서 합집합을 구함

if **name** == '**main**':
n = int(input())
eng_news = set(input().split())
b = int(input())
fra_news = set(input().split())

print(len(eng_news.union(fra_news)))

Set .intersection() Operation


입력 : 이전 문제와 같음
출력 : 영어 신문, 프랑스 신문 둘 다 구독하는 학생 수
예제 : 둘 다 구독하는 학생 번호 - (1 2 3 6 8)

9
1 2 3 4 5 6 7 8 9
9
10 1 2 3 11 21 55 6 8

5

intersection() 함수를 사용해서 합집합을 구함

if **name** == '**main**':
n = int(input())
eng_news = set(input().split())
b = int(input())
fra_news = set(input().split())

print(len(eng_news.intersection(fra_news)))

Set .difference() Operation


입력 : 이전 문제와 같음
출력 : 영어 신문만 구독하는 학생 수
예제 : 영어 신문만 구독한 학생 번호 - (4 5 7 9)

9
1 2 3 4 5 6 7 8 9
9
10 1 2 3 11 21 55 6 8

4

difference() 함수를 사용안해도 - 해서 구할수도 있다

if **name** == '**main**':
n = int(input())
eng_news = set(input().split())
b = int(input())
fra_news = set(input().split())

print(len(eng_news.difference(fra_news)))
# print(len(eng_news - fra_news))

Set .symmetric_difference() Operation


입력 : 이전 문제와 같음
출력 : 영어 신문만 구독하거나 프랑스 신문만 구독한 학생 수
예제 : 둘 다 구독하는 학생 번호 - (4 5 7 9 10 11 21 55)

9
1 2 3 4 5 6 7 8 9
9
10 1 2 3 11 21 55 6 8

8

symmetric_difference() 함수를 사용

if **name** == '**main**':
n = int(input())
eng_news = set(input().split())
b = int(input())
fra_news = set(input().split())

print(len(eng_news.symmetric_difference(fra_news)))